package com.example.demo;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * @author youngki
 */
@Data
@Slf4j
public class UserSmartIotProtocol {
    /**
     * 11      * 协议最短长度 30 字节
     * 12
     */
    public static int MIN_LEN = 30;

    /**
     * 数据包启动符号 @@
     */
    public static short START = 16448;

    /**
     * 21      * 业务流水号
     * 22
     */
    private short flowid;
    /**
     * 25      * 主版本
     * 26
     */
    private byte version_major;
    /**
     * 次版本
     */
    private byte version_minor;
    /**
     * 33      * 秒
     * 34
     */
    private byte second;
    /**
     * 分钟
     */
    private byte minute;
    /**
     * 小时
     */
    private byte hour;
    /**
     * 日
     */
    private byte day;
    /**
     * 月
     */
    private byte month;
    /**
     * 年
     */
    private byte year;
    /**
     * 数据包的源地址
     */
    private byte[] src;
    /**
     * 数据包的目的地址
     */
    private byte[] dest;
    /**
     * 应用数据单元长度 长度不应大于1024；低字节传输在前
     */
    private int data_len;
    /**
     * 命令字节 为控制单元的命令字节
     */
    private byte cmd;
    /**
     * 应用数据单元  对于确认/否认等命令包，此单元可为空
     */
    private String data;
    /**
     * 校验和 控制单元中各字节数据（第3～第27字节）及应用数据单元的算术校验和，舍去8位以上的进位位后所形成的1字节二进制数
     */
    private byte checksum;
    /**
     * 协议结束符号 ##
     */
    public static short END = 8995;

    /**
     * 打印调试信息
     */
    public void printDebugInfo() {
        log.info("---------完整数据包开始------------"+"|开始标志: " + printHexShort(START)+"|开始标志: " + printHexShort(START)
        +"|业务流水: " + printHexShort(flowid) + "\tFlowID:" + flowid+"|协议版本: " + printHexByte(version_major) + printHexByte(version_minor)+
                        "|时间标签: " + "20" + year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second+
                        "|源地址  : " + printHexBytes(src)+"|目的地址: " + printHexBytes(dest)+"|数据长度: " + data_len+"|命令字节: " + printHexByte(cmd)
                +"|应用数据: " + data+"|校验字节: " + printHexByte(checksum)+"|结束标志: " + printHexShort(END)
        );
    }




    private String printHexByte(byte b) {
        return String.format("%02X", b);
    }

    private String printHexBytes(byte[] bytes) {
        String str = "";
        for (int i = 0; i < bytes.length; i++) {
            str += String.format("%02X", bytes[i]);
        }
        return str;
    }

    private String printHexShort(int s) {
        byte[] bytes = hexShort(s);
        return printHexBytes(bytes);
    }

    private byte[] hexShort(int s) {
        byte[] bytes = new byte[2];
        bytes[0] = (byte) ((s << 24) >> 24);
        bytes[1] = (byte) ((s << 16) >> 24);
        return bytes;
    }

    private byte[] hexInt(int n) {
        byte[] bytes = new byte[4];
        bytes[3] = (byte) ((n) >> 24);
        bytes[2] = (byte) ((n << 8) >> 24);
        bytes[1] = (byte) ((n << 16) >> 24);
        bytes[0] = (byte) ((n << 24) >> 24);
        return bytes;
    }

}
